package com.conselheiro.web.facade;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import com.conselheiro.web.entidade.Avaliacao;
import com.conselheiro.web.entidade.Conselho;
import com.conselheiro.web.entidade.Post;
import com.conselheiro.web.entidade.Relato;
import com.conselheiro.web.entidade.Usuario;
import com.conselheiro.web.entidade.enumeration.Genero;
import com.conselheiro.web.entidade.enumeration.TipoPost;
import com.conselheiro.web.exception.CadastroException;
import com.conselheiro.web.exception.FalhaAutenticacaoException;
import com.conselheiro.web.notification.GerenciadorNotificacao;
import com.conselheiro.web.persistence.webdao.AvaliacaoWebDAO;
import com.conselheiro.web.persistence.webdao.PostWebDAO;
import com.conselheiro.web.persistence.webdao.UsuarioWebDAO;

public class Conselheiro {

	UsuarioWebDAO usuarioWebDAO;
	PostWebDAO postWebDAO;
	AvaliacaoWebDAO avaliacaoWebDAO;
	Logger LOGGER = Logger.getLogger(getClass());

	public Conselheiro() {
		usuarioWebDAO = new UsuarioWebDAO();
		postWebDAO = new PostWebDAO();
		avaliacaoWebDAO = new AvaliacaoWebDAO();
	}

	public void logar(String login, String senha)
			throws FalhaAutenticacaoException {
		if (usuarioWebDAO.getUsuario(login, senha) == null) {
			throw new FalhaAutenticacaoException();
		}
	}

	public void cadastrar(String senha, String nome, String sobrenome,
			String email, Date dataNascimento, Genero genero)
			throws CadastroException {
		Usuario novo = new Usuario();
		novo.setNome(nome + " " + sobrenome);
		novo.setLogin(email);
		novo.setSenha(senha);
		novo.setDataNascimento(dataNascimento);
		novo.setGenero(genero);

		try {
			usuarioWebDAO.adicionar(novo);
		} catch (Exception e) {
			throw new CadastroException(e);
		}
	}

	public void relatar(Usuario usuario, String descricao, TipoPost tipo) {
		Relato relato = new Relato();
		relato.setDescricao(descricao);
		relato.setTipo(tipo);
		relato.setUsuario(usuario);

		postWebDAO.adicionar(relato);
	}

	public void aconselhar(Usuario usuario, String descricao, Relato relato) {
		Conselho conselho = new Conselho();
		conselho.setDescricao(descricao);
		conselho.setTipo(relato.getTipo());
		conselho.setUsuario(usuario);
		conselho.setRelato(relato);
		relato.getUsuario().setNovosConselhos(true);
		
		for (Usuario u : relato.getUsuariosSeguindo()) {
			u.setNovidadesNosRelatos(true);
			usuarioWebDAO.atualizar(u);
		}

		usuarioWebDAO.atualizar(relato.getUsuario());
		postWebDAO.adicionar(conselho);
	}
	
	public void resetNotificacaoNovosConselhos(Usuario usuario) {
		usuario.setNovosConselhos(false);
		usuarioWebDAO.atualizar(usuario);
	}
	
	public void resetNotificacaoNovidadesNosRelatos(Usuario usuario) {
		usuario.setNovidadesNosRelatos(false);
		usuarioWebDAO.atualizar(usuario);
	}
	
	public void seguirRelato(Usuario usuario, Relato relato) {
		usuario.getRelatosSeguidos().add(relato);
		relato.getUsuariosSeguindo().add(usuario);
		postWebDAO.atualizar(relato);
	}
	
	public void desfazerSeguirRelato(Usuario usuario, Relato relato) {
		usuario.getRelatosSeguidos().remove(relato);
		relato.getUsuariosSeguindo().remove(usuario);
		postWebDAO.atualizar(relato);
	}

	public List<Relato> listarRelatos() {
		return postWebDAO.recuperarRelatos();
	}
	
	public List<Post> buscarPosts(String stringBusca) {
		return postWebDAO.buscarPosts(stringBusca);
	}

	public Usuario getUsuario(String login) {
		return usuarioWebDAO.recuperarUsuario(login);
	}

	public Relato getRelato(long idRelato) {
		return (Relato) postWebDAO.recuperarRelato(idRelato);
	}

	public List<Relato> getRelatosPorUsuario(Usuario usuario, int first,
			int pageSize) {
		return postWebDAO.getRelatosPorUsuario(usuario, first, pageSize);
	}

	public Usuario getUsuario(long idUsuario) {
		return usuarioWebDAO.recuperar(idUsuario);
	}

	public List<Relato> getRelatosAconselhadosPorUsuario(Usuario usuario,
			int first, int pageSize) {
		return postWebDAO.getRelatosAconselhadosPorUsuario(usuario, first, pageSize);
	}
	
	public void notificarNovoUsuario(String email, String nome, String sobrenome) {
		GerenciadorNotificacao.notificarCadastro(email, nome, sobrenome);
	}

	public List<Relato> getLinhaDoTempoPorUsuario(Usuario usuario, int first,
			int pageSize) {
		return postWebDAO.getLinhaDoTempoPorUsuario(usuario, first, pageSize);
	}

	public long getTotalRelatosUsuario(String login) {
		return postWebDAO.getTotalRelatosUsuario(login);
	}

	public long getTotalConselhosUsuario(String login) {
		return postWebDAO.getTotalConselhosUsuario(login);
	}
	
	public TipoPost getAreaInteresseUsuario(String login) {
		return postWebDAO.getAreaInteresseUsuario(login);
	}

	public void avaliarConselho(Avaliacao avaliacao) {
		avaliacaoWebDAO.adicionar(avaliacao);
	}

	public void atualizarAvalicaoConselho(Conselho conselho) {
		conselho.setAvaliacao(avaliacaoWebDAO.getMediaAvaliacao(conselho));
		postWebDAO.atualizar(conselho);
	}

	public Avaliacao getAvaliacao(String login, Conselho conselho) {
		return avaliacaoWebDAO.getAvaliacao(login, conselho);
	}

}
